package arm.common.converter;

import arm.common.entity.IBaseEntity;

import javax.faces.component.UIComponent;
import javax.faces.component.UISelectItems;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.model.SelectItem;

public class IdentifableConverter implements Converter {

    /**
     * Получение значения при конвертации с интерфейса на сервер
     * @param facesContext контекст
     * @param uiComponent компонент интерфейса
     * @param s Строка
     * @return сконвертированный объект
     */
    public Object getAsObject(FacesContext facesContext, UIComponent uiComponent, String s) {
        if (s == null || s.equals(Long.valueOf(-1).toString())) {
            return null;
        }
        UISelectItems selectItems = getSelectItems(uiComponent);
        return getSelectedIdentifiable(selectItems, s);
    }

    /**
     * Получение значения при конвертации с сервера в интерфейс
     * @param facesContext контекст
     * @param uiComponent компонент интерфейса
     * @param o Объект
     * @return сконвертированная строка
     */
    public String getAsString(FacesContext facesContext, UIComponent uiComponent, Object o) {
        return ((IBaseEntity) o).getId().toString();
    }

    /**
     * Получение значения
     * @param parent родительский пользователский компонент
     * @return элемент, значение в комбобоксе
     */
    protected UISelectItems getSelectItems(UIComponent parent) {
        for (int i = 0; i < parent.getChildCount(); i++) {
            UIComponent item = parent.getChildren().get(i);
            if (item instanceof UISelectItems) {
                return (UISelectItems) item;
            }
        }
        return null;
    }

    /**
     * Получение значения
     * @param id первичный ключ
     * @param selectItems элемент, значение в комбобоксе
     * @return значение
     */
    protected IBaseEntity getSelectedIdentifiable(
            UISelectItems selectItems, String id) {
        java.util.List<SelectItem> items = (java.util.List<SelectItem>) selectItems.getValue();
        for (int i = 0; i < items.size(); i++) {
            SelectItem item = items.get(i);
            if (id.equals(((IBaseEntity) item.getValue()).getId().toString())) {
                return (IBaseEntity) item.getValue();
            }
        }
        return null;
    }
}